//package com.moyun.bpm.controller;
//
//
//import cn.hutool.core.io.file.FileReader;
//import cn.hutool.core.util.ReUtil;
//import cn.hutool.json.JSONObject;
//import cn.hutool.json.JSONString;
//import cn.hutool.json.JSONUtil;
//import cn.hutool.poi.excel.ExcelUtil;
//import cn.hutool.poi.excel.ExcelWriter;
//import com.alibaba.fastjson.JSON;
//import com.moyun.bpm.pojo.entity.ChatRecord;
//import com.moyun.bpm.service.ChatRecordService;
//import com.moyun.common.controller.CommonController;
//import com.moyun.common.pojo.entity.JsonResult;
//import io.swagger.annotations.Api;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.pdfbox.io.RandomAccessFile;
//import org.apache.pdfbox.pdfparser.PDFParser;
//import org.apache.pdfbox.pdmodel.PDDocument;
//import org.apache.pdfbox.text.PDFTextStripper;
//import org.junit.Test;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.data.redis.core.StringRedisTemplate;
//import org.springframework.web.bind.annotation.GetMapping;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//
//import java.io.File;
//import java.io.FileNotFoundException;
//import java.io.IOException;
//import java.util.*;
//
///**
// * <p>
// * 前端控制器
// * </p>
// *
// * @author yangboxuan
// * @since 2021-10-13
// */
//@Slf4j
//@Api(tags = "ChatRecord")
//@RestController
//@RequestMapping("/bpm/chatRecord")
//public class ChatRecordController extends CommonController<Object, ChatRecord, Object, String> {
//    @Autowired
//    private ChatRecordService chatRecordService;
//
//    @Autowired
//    private cn.ybx.matespringbootautoconfigure.xx.HelloService helloService;
//
//    @Autowired
//    private RedisTemplate stringRedisTemplate;
//
//
//    @Test
//    public void testxx() {
//        String a = "2²";
//        //通过工具类创建writer
//        ExcelWriter writer = ExcelUtil.getWriter("d:/writeTest.xlsx");
////通过构造方法创建writer
////ExcelWriter writer = new ExcelWriter("d:/writeTest.xls");
//
////跳过当前行，既第一行，非必须，在此演示用
////        writer.passCurrentRow();
//
////合并单元格后的标题行，使用默认标题样式
////        writer.merge(row1.size() - 1, "测试标题");
////一次性写出内容，强制输出标题
//        writer.write(Collections.singleton(a), true);
////关闭writer，释放内存
//        writer.close();
//    }
//
//    @GetMapping
//    public JsonResult xx() {
//        return JsonResult.ok(this.helloService.sayHello("杨渤璇"));
//    }
//
//    @Test
//    public void test() throws FileNotFoundException {
//        String fileName = "G:\\BaiduNetdiskDownload\\Java面试题大全（2021年）.pdf";
//        FileReader fileReader = new FileReader(fileName);
//        String s = fileReader.readString();
//        System.out.println("hahahha");
//
//
//    }
//
//    /**
//     * 读取PDF文件的文字内容
//     *
//     * @throws Exception
//     */
//
//    @GetMapping("/xxxxx")
//    public void getTextFromPdf() throws Exception {
//        // 是否排序
//        String pdfPath = "G:\\BaiduNetdiskDownload\\Java面试题大全（2021年）.pdf";
//        boolean sort = false;
//
//
//        String content = null;
//
//        File pdfFile = new File(pdfPath);
//        //指定文件可读可写
//        RandomAccessFile randomFile = new RandomAccessFile(pdfFile, "rw");
//
//        PDDocument document = null;
//
//        try {
//            // 加载 pdf 文档
//            PDFParser parser = new PDFParser(randomFile);
//
//            parser.parse();
//
//            document = parser.getPDDocument();
//
//            /**
//             * 获取内容信息
//             * 1.首先获取 PDFTextStripper 对象
//             * 2.设置读取的 开始页startPage 和 结束页endPage
//             **/
//            PDFTextStripper pts = new PDFTextStripper();
//            pts.setSortByPosition(sort);
//            int endPage = document.getNumberOfPages();
//            System.out.println("Total Page: " + endPage);
//            pts.setEndPage(192);
//
//
//            content = pts.getText(document);
//            // 1. 按照一级标题进行切割分组 获取各个一级标题下的所有内容
//            String[] level1Contents = content.split("面试题");
//            // 收集所有一级标题
//            List<String> level1HeadingList = ReUtil.findAll("第[([一二三四五六七八九十]章)|(十[一二三四五六七八九十]章)][:：' '\\u4e00-\\u9fa5\\w]*面试题", content, 0, new ArrayList<String>());
//            LinkedHashMap<String, Object> level1HeadingMap = new LinkedHashMap<>();
//            level1HeadingList.forEach(level1HeadingStr -> level1HeadingMap.put(level1HeadingStr, null));
//            ArrayList<List<List<String>>> listss = new ArrayList<>();
//            int i = 0;
//            LinkedHashMap<String, Object> level2HeadingStrMap = new LinkedHashMap<>();
//            for (String level1Content : level1Contents) {
//
//                String oneLevelHeadingStr = level1HeadingList.get(i++);
//                // 2. 获取二级标题集合
//                List<String> level2HeadingList = ReUtil.findAll("[零一二三四五六七八九十]、[\\u4e00-\\u9fa5\\w]*", level1Content, 0, new ArrayList<String>());
//                if (level2HeadingList.size() == 0) {
//                    i = 0;
//                    continue;
//                }
//                level2HeadingStrMap.put(oneLevelHeadingStr, level2HeadingList);
//                // 2. 按照二级标题进行分组 获取各个二级标题下的内容
//                String[] level2Contents = level1Content.split("[零一二三四五六七八九十]、[\\u4e00-\\u9fa5\\w]*");
//                ArrayList<List<String>> lists = new ArrayList<>();
//                int j = 0;
//                LinkedHashMap<String, Object> level3HeadingStrMap = new LinkedHashMap<>();
//                for (String level2Content : level2Contents) {
//                    // 3. 获取二级标题下的 所有三级标题 集合 lg: 1.1 何为编程 1.2 什么是java
//                    ArrayList<String> level3HeadingList = ReUtil.findAll("\\s{1,}\\d*\\.\\d*[\\u4e00-\\u9fa5\\w?？' '\\.、]*\\s{0,1}", level2Content, 0, new ArrayList<String>());
//
//                    String oneLevel2HeadingStr = level2HeadingList.get(j++);
//                    if (level3HeadingList.size() == 0) {
//                        j = 0;
//                        continue;
//                    }
//                    level3HeadingStrMap.put(oneLevel2HeadingStr, level3HeadingList);
//                    // 4. 获取各个三级标题下的内容 lg: 1.1的答案 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码，并 终得到结果的过程。
//                    String[] level3Contents = level2Content.split("\\s{1,}\\d*\\.\\d*[\\u4e00-\\u9fa5\\w?？' '\\.、]*\\s{0,1}");
//                    System.out.println("hahaha");
//
//                    lists.add(level3HeadingList);
//
//
//                }
//
//                System.out.println("哈哈哈");
//                listss.add(lists);
//                level2HeadingStrMap.put(oneLevelHeadingStr, level3HeadingStrMap);
//
//                System.out.println("hahahah");
//
//            }
//
//            this.stringRedisTemplate.opsForValue().set("2021年Java面试大全", JSON.toJSONString(level2HeadingStrMap));
//
//
//
//            log.warn("Get PDF Content ...");
//        } catch (Exception e) {
//            throw e;
//        } finally {
//            // 关闭PDDocument对象
//            if (null != document)
//                document.close();
//
//        }
//
//
//    }
//
//
////    @GetMapping("/xxxxxxxxxx")
////    public JsonResult textxxxxxxxxxxxxxxx() {
////        String o = (String) this.stringRedisTemplate.opsForValue().get("2021年Java面试大全");
////        JSON.parseObject(o, LinkedHashMap.class.var
////        return JsonResult.ok().setData(jsonObject);
////
////    }
//
//    @Test
//    public void testxxx() throws IOException {
//
//        String s = "  \n" +
//                "一、集合容器概述  \n" +
//                "1.1 什么是集合  \n" +
//                "集合框架：用于存储数据的容器。\n" +
//                "集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。\n" +
//                "任何集合框架都包含三大块内容：对外的接口、接口的实现和对集合运算的算法。\n" +
//                "接口：表示集合的抽象数据类型。接口允许我们操作集合时不必关注具体实现，从而达到“多态”。在面\n" +
//                "向对象编程语言中，接口通常用来形成规范。\n" +
//                "实现：集合接口的具体实现，是重用性很高的数据结构。\n" +
//                "算法：在一个实现了某个集合框架中的接口的对象身上完成某种有用的计算的方法，例如查找、排序\n" +
//                "等。这些算法通常是多态的，因为相同的方法可以在同一个接口被多个类实现时有不同的表现。事实\n" +
//                "上，算法是可复用的函数。\n" +
//                "它减少了程序设计的辛劳。\n" +
//                "集合框架通过提供有用的数据结构和算法使你能集中注意力于你的程序的重要部分上，而不是为了让程\n" +
//                "序能正常运转而将注意力于低层设计上。\n" +
//                "通过这些在无关API之间的简易的互用性，使你免除了为改编对象或转换代码以便联合这些API而去写大\n" +
//                "量的代码。 它提高了程序速度和质量。\n" +
//                "二、List接口  \n" +
//                "2.1 迭代器 Iterator 是什么？  \n" +
//                "Iterator 接口提供遍历任何 Collection 的接口。我们可以从一个 Collection 中使用迭代器方法来获取迭\n" +
//                "代器实例。迭代器取代了 Java 集合框架中的 Enumeration，迭代器允许调用者在迭代过程中移除元\n" +
//                "素。\n" +
//                "三、Set接口  \n" +
//                "3.1 说一下 HashSet 的实现原理？  \n" +
//                "HashSet 是基于 HashMap 实现的，HashSet的值存放于HashMap的key上，HashMap的value统一为\n" +
//                "PRESENT，因此 HashSet 的实现比较简单，相关 HashSet 的操作，基本上都是直接调用底层 \n" +
//                "HashMap 的相关方法来完成，HashSet 不允许重复的值。\n";
//
//
////        String[] split = s.split("^[一、|二、|.....].*\\\\n$");
////        for (String s1 : split) {
////            String s2 = s1.toString();
////            System.out.println(s2);
////        }
//
////        List<String> resultFindAll = ReUtil.findAll("(一、)|(二、)", s, 0, new ArrayList<String>());
//
////        List<String> resultFindAll = ReUtil.findAll("[零一二三四五六七八九十]、[\\u4e00-\\u9fa5\\w]*", s, 0, new ArrayList<String>());
//
//        // \u4e00-\u9fa5 表示中文汉字 \w 表示字母数字下划线 ?？表示中文和英文问号  ' '表示空格  \s 表示空格换行
////        List<String> resultFindAll = ReUtil.findAll("\\d*\\.\\d*[\\u4e00-\\u9fa5\\w?？' ']*\\s", s, 0, new ArrayList<String>());
//
//        List<String> resultFindAll = ReUtil.findAll("[零一二三四五六七八九十]、[\\u4e00-\\u9fa5\\w]*\\s*([\\u4e00-\\u9fa5\\w\\.' '?？,.:，。：“”\"\"、]*\\s)*", s, 0, new ArrayList<String>());
//
//        System.out.println("haha");
//
//
//    }
//
//
//    @Test
//    public void testxxxxx() {
//        String s = new String();
//        s = "  \n" +
//                "一、Java概述  \n" +
//                "1.1 何为编程  \n" +
//                "编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码，并 终得到结果的过程。\n" +
//                "为了使计算机能够理解人的意图，人类就必须要将需解决的问题的思路、方法、和手段通过计算机能够\n" +
//                "理解的形式告诉计算机，使得计算机能够根据人的指令一步一步去工作，完成某种特定的任务。这种人\n" +
//                "和计算机之间交流的过程就是编程。\n" +
//                "1.2 什么是Java  \n" +
//                "Java是一门面向对象编程语言，不仅吸收了C++语言的各种优点，还摒弃了C++里难以理解的多继承、指\n" +
//                "针等概念，因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代\n" +
//                "表，极好地实现了面向对象理论，允许程序员以优雅的思维方式进行复杂的编程 。\n" +
//                "1.3 jdk1.5之后的三大版本  \n" +
//                "Java SE（J2SE，Java 2 Platform Standard Edition，标准版）\n" +
//                "Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java \n" +
//                "应用程序。Java SE 包含了支持 Java Web 服务开发的类，并为Java EE和Java ME提供基础。\n" +
//                "Java EE（J2EE，Java 2 Platform Enterprise Edition，企业版）\n" +
//                "Java EE 以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端Java 应\n" +
//                "用程序。Java EE 是在  Java SE 的基础上构建的，它提供 Web 服务、组件模型、管理和通信  API，\n" +
//                "可以用来实现企业级的面向服务体系结构（service-oriented architecture，SOA）和  Web2.0应\n" +
//                "用程序。2018年2月，Eclipse 宣布正式将 JavaEE 更名为 JakartaEE\n" +
//                "Java ME（J2ME，Java 2 Platform Micro Edition，微型版）\n" +
//                "Java ME 以前称为 J2ME。Java ME  为在移动设备和嵌入式设备（比如手机、PDA、电视机顶盒和\n" +
//                "打印机）上运行的应用程序提供一个健壮且灵活的环境。Java ME  包括灵活的用户界面、健壮的安\n" +
//                "全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于 Java \n" +
//                "ME  规范的应用程序只需编写一次，就可以用于许多设备，而且可以利用每个设备的本机功能。\n" +
//                "1.4 JVM、JRE和JDK的关系  \n" +
//                "JVM\n" +
//                "Java Virtual Machine是Java虚拟机，Java程序需要运行在虚拟机上，不同的平台有自己的虚拟机，因此\n" +
//                "Java语言可以实现跨平台。\n" +
//                "JRE\n" +
//                "Java Runtime Environment包括Java虚拟机和Java程序所需的核心类库等。核心类库主要是java.lang\n" +
//                "包：包含了运行Java程序必不可少的系统类，如基本数据类型、基本数学函数、字符串处理、线程、异\n" +
//                "常处理类等，系统缺省加载这个包\n" +
//                "如果想要运行一个开发好的Java程序，计算机中只需要安装JRE即可。\n" +
//                "JDK\n" +
//                "Java Development Kit是提供给Java开发人员使用的，其中包含了Java的开发工具，也包括了JRE。所以\n" +
//                "安装了JDK，就无需再单独安装JRE了。其中的开发工具：编译工具(javac.exe)，打包工具(jar.exe)等\n" +
//                "JVM&JRE&JDK关系图\n" +
//                "1\n" +
//                "公\n" +
//                "众\n" +
//                "号\n" +
//                "：\n" +
//                "Ja\n" +
//                "va\n" +
//                "旅\n" +
//                "途\n" +
//                "1.5 什么是跨平台性？原理是什么  \n" +
//                "所谓跨平台性，是指java语言编写的程序，一次编译后，可以在多个系统平台上运行。\n" +
//                "实现原理：Java程序是通过java虚拟机在系统平台上运行的，只要该系统可以安装相应的java虚拟机，该\n" +
//                "系统就可以运行java程序。\n" +
//                "1.6 Java语言有哪些特点  \n" +
//                "简单易学（Java语言的语法与C语言和C++语言很接近）\n" +
//                "面向对象（封装，继承，多态）\n" +
//                "平台无关性（Java虚拟机实现平台无关性）\n" +
//                "支持网络编程并且很方便（Java语言诞生本身就是为简化网络编程设计的）\n" +
//                "支持多线程（多线程机制使应用程序在同一时间并行执行多项任）\n" +
//                "健壮性（Java语言的强类型机制、异常处理、垃圾的自动收集等）\n" +
//                "安全性\n" +
//                "1.7 什么是字节码？采用字节码的最大好处是什么  \n" +
//                "字节码：Java源代码经过虚拟机编译器编译后产生的文件（即扩展为.class的文件），它不面向任何特定\n" +
//                "的处理器，只面向虚拟机。\n" +
//                "采用字节码的好处：\n" +
//                "Java语言通过字节码的方式，在一定程度上解决了传统解释型语言执行效率低的问题，同时又保留了解\n" +
//                "释型语言可移植的特点。所以Java程序运行时比较高效，而且，由于字节码并不专对一种特定的机器，\n" +
//                "因此，Java程序无须重新编译便可在多种不同的计算机上运行。\n" +
//                "先看下java中的编译器和解释器：\n" +
//                "Java中引入了虚拟机的概念，即在机器和编译程序之间加入了一层抽象的虚拟机器。这台虚拟的机器在\n" +
//                "任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机，生成虚拟机能够理解的\n" +
//                "代码，然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中，这种供虚拟机理解的代\n" +
//                "码叫做字节码（即扩展为.class的文件），它不面向任何特定的处理器，只面向虚拟机。每一种平台的解\n" +
//                "2\n" +
//                "公\n" +
//                "众\n" +
//                "号\n" +
//                "：\n" +
//                "Ja\n" +
//                "va\n" +
//                "旅\n" +
//                "途\n" +
//                "释器是不同的，但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码，字节码由虚拟\n" +
//                "机解释执行，虚拟机将每一条要执行的字节码送给解释器，解释器将其翻译成特定机器上的机器码，然\n" +
//                "后在特定的机器上运行，这就是上面提到的Java的特点的编译与解释并存的解释。\n" +
//                "1.8 什么是Java程序的主类？应用程序和小程序的主类有何不同？  \n" +
//                "一个程序中可以有多个类，但只能有一个类是主类。在Java应用程序中，这个主类是指包含main()方法\n" +
//                "的类。而在Java小程序中，这个主类是一个继承自系统类JApplet或Applet的子类。应用程序的主类不一\n" +
//                "定要求是public类，但小程序的主类要求必须是public类。主类是Java程序执行的入口点。\n" +
//                "1.9 Java应用程序与小程序之间有那些差别？  \n" +
//                "简单说应用程序是从主线程启动(也就是main()方法)。applet小程序没有main方法，主要是嵌在浏览器\n" +
//                "页面上运行(调用init()线程或者run()来启动)，嵌入浏览器这点跟flash的小游戏类似。\n" +
//                "1.10 Java和C++的区别  \n" +
//                "我知道很多人没学过C++，但是面试官就是没事喜欢拿咱们Java和C++比呀！没办法！！！就算没学过\n" +
//                "C++，也要记下来！\n" +
//                "都是面向对象的语言，都支持封装、继承和多态\n" +
//                "Java不提供指针来直接访问内存，程序内存更加安全\n" +
//                "Java的类是单继承的，C++支持多重继承；虽然Java的类不可以多继承，但是接口可以多继承。\n" +
//                "Java有自动内存管理机制，不需要程序员手动释放无用内存\n" +
//                "1.11 Oracle JDK 和 OpenJDK 的对比  \n" +
//                "1. Oracle JDK版本将每三年发布一次，而OpenJDK版本每三个月发布一次；\n" +
//                "2. OpenJDK 是一个参考模型并且是完全开源的，而Oracle JDK是OpenJDK的一个实现，并不是完全\n" +
//                "开源的；\n" +
//                "3. Oracle JDK 比 OpenJDK 更稳定。OpenJDK和Oracle JDK的代码几乎相同，但Oracle  JDK有更多的\n" +
//                "类和一些错误修复。因此，如果您想开发企业/商业软件，我建议您选择Oracle  JDK，因为它经过\n" +
//                "了彻底的测试和稳定。某些情况下，有些人提到在使用OpenJDK  可能会遇到了许多应用程序崩溃\n" +
//                "的问题，但是，只需切换到Oracle JDK就可以解决问题；\n" +
//                "4. 在响应性和JVM性能方面，Oracle JDK与OpenJDK相比提供了更好的性能；\n" +
//                "5. Oracle JDK不会为即将发布的版本提供长期支持，用户每次都必须通过更新到 新版本获得支持来\n" +
//                "获取 新版本；\n" +
//                "6. Oracle JDK根据二进制代码许可协议获得许可，而OpenJDK根据GPL v2许可获得许可。\n" +
//                "二、基础语法  \n" +
//                "2.1 Java有哪些数据类型  \n" +
//                "定义：Java语言是强类型语言，对于每一种数据都定义了明确的具体的数据类型，在内存中分配了不同\n" +
//                "大小的内存空间。\n" +
//                "分类\n" +
//                "基本数据类型   \n" +
//                "数值型     \n" +
//                "整数类型(byte,short,int,long)\n" +
//                "浮点类型(float,double)\n" +
//                "Java源代码---->编译器---->jvm可执行的Java字节码(即虚拟指令)---->jvm---->jvm中解释器-----\n" +
//                ">机器可执行的二进制机器码---->程序运行。\n" +
//                "3\n" +
//                "公\n" +
//                "众\n" +
//                "号\n" +
//                "：\n" +
//                "Ja\n" +
//                "va\n" +
//                "旅\n" +
//                "途\n" +
//                "字符型(char)\n" +
//                "布尔型(boolean)\n" +
//                "引用数据类型   \n" +
//                "类(class)\n" +
//                "接口(interface)\n" +
//                "数组([])\n" +
//                "Java基本数据类型图\n";
//
//
//        List<String> resultFindAll = ReUtil.findAll("\\s{1,}\\d*\\.\\d*[\\u4e00-\\u9fa5\\w?？' '\\.、]*\\s{0,1}", s, 0, new ArrayList<String>());
//
//
//        System.out.println("hahha");
//    }
//
//
//}
//
